package com.lab.controller.teacher;


import com.lab.common.Result;
import com.lab.service.WeeklyReportService;
import com.lab.vo.WeeklyReportVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 管理员周报管理控制器
 */
@RestController
@RequestMapping("/teacher/weeklyReport")
@Slf4j
@Api(tags = "郭帅斐老师端-周报管理接口")
public class WeeklyReportTeacherController {

    @Autowired
    private WeeklyReportService weeklyReportService;

    /**
     * 根据ID查询周报基本信息
     * @param id 周报ID
     * @return 周报基本信息
     */
//    @GetMapping("/{id}")
//    @ApiOperation("根据ID查询周报基本信息")
//    public Result<WeeklyReport> getById(
//            @ApiParam(value = "周报ID", required = true)
//            @PathVariable Integer id) {
//        log.info("根据ID查询周报：{}", id);
//        WeeklyReport weeklyReport = weeklyReportService.getById(id);
//        return Result.success(weeklyReport);
//    }

    /**
     * 根据成员ID查询周报列表
     * @param memberId 成员ID
     * @return 周报列表
     */
//    @GetMapping("/member/{memberId}")
//    @ApiOperation("根据成员ID查询周报列表")
//    public Result<List<WeeklyReport>> getByMemberId(
//            @ApiParam(value = "成员ID", required = true)
//            @PathVariable Integer memberId) {
//        log.info("根据成员ID查询周报列表：{}", memberId);
//        List<WeeklyReport> weeklyReports = weeklyReportService.getByMemberId(memberId);
//        return Result.success(weeklyReports);
//    }

//    /**
//     * 根据成员ID查询周报完整信息（包含内容列表）
//     * @param memberId 成员ID
//     * @return 周报完整信息列表
//     */
//    @GetMapping("/withContents/member/{memberId}")
//    @ApiOperation("根据成员ID查询周报完整信息（包含内容列表）")
//    public Result<List<WeeklyReportVO>> getReportWithContentsByMemberId(
//            @ApiParam(value = "成员ID", required = true)
//            @PathVariable Integer memberId) {
//        log.info("根据成员ID查询周报完整信息：{}", memberId);
//        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByMemberId(memberId);
//        return Result.success(weeklyReportVOs);
//    }



    /**
     * 根据成员名称查询周报完整信息（包含内容列表和成员角色）
     * @param memberName 成员名称
     * @return 周报完整信息列表
     */
    @GetMapping("/withContents/memberName")
    @ApiOperation("根据成员名称查询周报完整信息（包含内容列表和成员角色）")
    public Result<List<WeeklyReportVO>> getReportWithContentsByMemberName(
            @ApiParam(value = "成员名称", required = true)
            @RequestParam String memberName) {
        log.info("根据成员名称查询周报完整信息：{}", memberName);
        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByMemberName(memberName);
        return Result.success(weeklyReportVOs);
    }
    
    /**
     * 根据角色类型查询周报完整信息（包含内容列表和成员角色）
     * @param roleType 角色类型（前端/后端）
     * @return 周报完整信息列表
     */
    @GetMapping("/withContents/roleType")
    @ApiOperation("根据角色类型查询周报完整信息（包含内容列表和成员角色）")
    public Result<List<WeeklyReportVO>> getReportWithContentsByRoleType(
            @ApiParam(value = "角色类型（前端/后端）", required = true, allowableValues = "frontend,backend")
            @RequestParam String roleType) {
        log.info("根据角色类型查询周报完整信息：{}", roleType);
        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByRoleType(roleType);
        return Result.success(weeklyReportVOs);
    }
    
    /**
     * 根据周数查询周报完整信息（包含内容列表和成员角色）
     * @param reportWeek 周数（1-52）
     * @param reportYear 年份
     * @return 周报完整信息列表
     */
    @GetMapping("/withContents/week")
    @ApiOperation("根据周数查询周报完整信息（包含内容列表和成员角色）")
    public Result<List<WeeklyReportVO>> getReportWithContentsByWeek(
            @ApiParam(value = "周数（1-52）", required = true, example = "42")
            @RequestParam Integer reportWeek,
            @ApiParam(value = "年份", required = true, example = "2023")
            @RequestParam Integer reportYear) {
        log.info("根据周数查询周报完整信息：第{}周，年份{}", reportWeek, reportYear);
        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByPage(reportWeek, reportYear);
        return Result.success(weeklyReportVOs);
    }
    
    /**
     * 分页查询周报完整信息（包含内容列表和成员角色）
     * @param page 页码（从1开始）
     * @param pageSize 每页条数（1-100）
     * @return 分页后的周报完整信息列表
     */
    @GetMapping("/withContents/page")
    @ApiOperation("分页查询周报完整信息（包含内容列表和成员角色）")
    public Result<List<WeeklyReportVO>> getReportWithContentsByPage(
            @ApiParam(value = "页码（从1开始）", required = true, example = "1")
            @RequestParam Integer page,
            @ApiParam(value = "每页条数（1-100）", required = true, example = "10")
            @RequestParam Integer pageSize) {
        log.info("分页查询周报完整信息：第{}页，每页{}条", page, pageSize);
        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByPage(page, pageSize);
        return Result.success(weeklyReportVOs);
    }
    
    /**
     * 根据角色类型分页查询周报完整信息（包含内容列表和成员角色）
     * @param roleType 角色类型（前端/后端）
     * @param page 页码（从1开始）
     * @param pageSize 每页条数（1-100）
     * @return 分页后的周报完整信息列表
     */
    @GetMapping("/withContents/roleType/page")
    @ApiOperation("根据角色类型分页查询周报完整信息（包含内容列表和成员角色）")
    public Result<List<WeeklyReportVO>> getReportWithContentsByRoleTypeAndPage(
            @ApiParam(value = "角色类型（前端/后端）", required = true, allowableValues = "frontend,backend")
            @RequestParam String roleType,
            @ApiParam(value = "页码（从1开始）", required = true, example = "1")
            @RequestParam Integer page,
            @ApiParam(value = "每页条数（1-100）", required = true, example = "10")
            @RequestParam Integer pageSize) {
        log.info("根据角色类型分页查询周报完整信息：角色类型{}，第{}页，每页{}条", roleType, page, pageSize);
        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByRoleTypeAndPage(roleType, page, pageSize);
        return Result.success(weeklyReportVOs);
    }

    /**
     * 根据成员ID分页查询周报完整信息（包含内容列表和成员角色）
     * @param memberId 成员ID
     * @param page 页码（从1开始）
     * @param pageSize 每页条数（1-100）
     * @return 分页后的周报完整信息列表
     */
//    @GetMapping("/withContents/member/{memberId}/page")
//    @ApiOperation("根据成员ID分页查询周报完整信息（包含内容列表和成员角色）")
//    public Result<List<WeeklyReportVO>> getReportWithContentsByMemberIdAndPage(
//            @ApiParam(value = "成员ID", required = true)
//            @PathVariable Integer memberId,
//            @ApiParam(value = "页码（从1开始）", required = true, example = "1")
//            @RequestParam Integer page,
//            @ApiParam(value = "每页条数（1-100）", required = true, example = "10")
//            @RequestParam Integer pageSize) {
//        log.info("根据成员ID分页查询周报完整信息：成员ID{}，第{}页，每页{}条", memberId, page, pageSize);
//        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByMemberIdAndPage(memberId, page, pageSize);
//        return Result.success(weeklyReportVOs);
//    }
    /**
     * 分页周数查询周报完整信息（包含内容列表和成员角色）
     * @param page 页码（从1开始）
     * @param pageSize 每页条数（1-100）
     * @return 分页后的周报完整信息列表
     */
    @GetMapping("/withContents/week/page")
    @ApiOperation("根据周数分页查询周报完整信息（包含内容列表和成员角色）")
    public Result<List<WeeklyReportVO>> getReportWithContentsByWeekAndPage(
            @ApiParam(value = "周数（1-52）", required = true, example = "42")
            @RequestParam Integer reportWeek,
            @ApiParam(value = "年份", required = true, example = "2023")
            @RequestParam Integer reportYear,
            @ApiParam(value = "页码（从1开始）", required = true, example = "1")
            @RequestParam Integer page,
            @ApiParam(value = "每页条数（1-100）", required = true, example = "10")
            @RequestParam Integer pageSize) {
        log.info("根据周数分页查询周报完整信息：第{}周，年份{}，第{}页，每页{}条", reportWeek, reportYear, page, pageSize);
        List<WeeklyReportVO> weeklyReportVOs = weeklyReportService.getReportWithContentsByWeekAndPage(reportWeek, reportYear, page, pageSize);
        return Result.success(weeklyReportVOs);
    }

    /**
     * 根据周数和年份删除周报信息（包括关联的周报内容）
     * @param reportWeek 周数（1-52）
     * @param reportYear 年份
     * @return 删除的记录数
     */
    @DeleteMapping("/deleteByWeek")
    @ApiOperation("根据周数和年份删除周报信息（包括关联的周报内容）")
    public Result<Integer> deleteByWeekAndYear(
            @ApiParam(value = "周数（1-52）", required = true, example = "42")
            @RequestParam Integer reportWeek,
            @ApiParam(value = "年份", required = true, example = "2023")
            @RequestParam Integer reportYear) {
        log.info("根据周数和年份删除周报信息：第{}周，年份{}", reportWeek, reportYear);
        Integer deletedCount = weeklyReportService.deleteByWeekAndYear(reportWeek, reportYear);
        return Result.success(deletedCount);
    }
}